package cn.edu.tju.elm.service;

import cn.edu.tju.core.model.User;
import cn.edu.tju.elm.dto.wallet.WalletDto;
import cn.edu.tju.elm.dto.wallet.WalletRuleDto;
import cn.edu.tju.elm.dto.wallet.WalletTransactionDto;
import cn.edu.tju.elm.dto.wallet.WalletOperationDto;
import cn.edu.tju.elm.model.wallet.Wallet;
import cn.edu.tju.elm.model.wallet.WalletRule;
import cn.edu.tju.elm.model.wallet.WalletTransaction;
import cn.edu.tju.elm.service.domain.VirtualWallet;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Date;
import java.util.List;
import java.math.BigDecimal;

public interface WalletService {
    
    // ========== 钱包管理 ==========
    
    /**
     * 创建钱包
     */
    WalletDto createWallet(Long userId, User creator);
    
    /**
     * 获取钱包信息
     */
    WalletDto getWalletByUserId(Long userId);
    
    /**
     * 检查用户钱包是否存在
     */
    boolean existsByUserId(Long userId);
    
    /**
     * 获取钱包Domain对象（用于内部业务逻辑）
     */
    VirtualWallet getWalletDomainByUserId(Long userId);
    
    /**
     * 购买SVIP会员（30天）
     */
    WalletDto purchaseSvip(Long userId, Long operator);
    
    // ========== 资金操作 ==========
    
    /**
     * 充值
     */
    WalletTransactionDto recharge(WalletOperationDto operationDto);
    
    /**
     * 提现
     */
    WalletTransactionDto withdraw(WalletOperationDto operationDto);
    
    /**
     * 支付
     */
    WalletTransactionDto pay(WalletOperationDto operationDto);
    
    /**
     * 转账
     */
    List<WalletTransactionDto> transfer(WalletOperationDto operationDto);
    
    /**
     * 退款
     */
    WalletTransactionDto refund(WalletOperationDto operationDto);
    
    /**
     * 冻结金额
     */
    WalletTransactionDto freeze(WalletOperationDto operationDto);
    
    /**
     * 解冻金额
     */
    WalletTransactionDto unfreeze(WalletOperationDto operationDto);

    /** 入账冻结（商家侧） */
    WalletTransactionDto freezeIncome(WalletOperationDto operationDto);

    /** 入账转为实际冻结（支付完成） */
    WalletTransactionDto realizeIncomeToFrozen(WalletOperationDto operationDto);
    
    // ========== 透支管理 ==========
    
    /**
     * 设置透支额度
     */
    WalletDto setOverdraftLimit(WalletOperationDto operationDto);
    
    /**
     * 增加透支额度
     */
    WalletDto increaseOverdraftLimit(WalletOperationDto operationDto);
    
    /**
     * 减少透支额度
     */
    WalletDto decreaseOverdraftLimit(WalletOperationDto operationDto);
    
    // ========== 查询服务 ==========
    
    /**
     * 获取交易记录（分页）
     */
    Page<WalletTransactionDto> getTransactions(Long userId, Pageable pageable);
    
    /**
     * 按时间段获取交易记录
     */
    List<WalletTransactionDto> getTransactionsByPeriod(Long userId, Date startDate, Date endDate);
    
    /**
     * 检查余额是否足够
     */
    boolean hasSufficientBalance(Long userId, BigDecimal amount);
    
    // ========== 规则管理 ==========
    
    /**
     * 创建奖励规则
     */
    WalletRuleDto createRewardRule(WalletRuleDto ruleDto, Long operator);
    
    /**
     * 启用规则
     */
    WalletRuleDto enableRule(Long ruleId, Long operator);
    
    /**
     * 禁用规则
     */
    WalletRuleDto disableRule(Long ruleId, Long operator);
    
    /**
     * 获取所有活跃规则
     */
    List<WalletRuleDto> getActiveRules();
    
    /**
     * 获取适用的充值奖励规则
     */
    List<WalletRuleDto> getApplicableDepositRules(BigDecimal amount);
}
